#include <iostream>
#include <utility>

void foo(int &x) { std::cout << "左值\n"; }
void foo(int &&x) { std::cout << "右值\n"; }

template <typename T>
void wrapper(T &&arg)
{
    // std::forward 是条件性转换：它把左值恢复成左值引用，把右值恢复成右值引用，保持原始值类别，实现完美转发
    foo(std::forward<T>(arg));
}

int main()
{
    int x = 42;
    wrapper(x);  // 输出：左值
    wrapper(42); // 输出：右值
    return 0;
}